﻿/* 
* Copyright (c) 2010, The University of Texas at Austin
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, 
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, 
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, 
* this list of conditions and the following disclaimer in the documentation and/or other materials 
* provided with the distribution.
*
* Neither the name of The University of Texas at Austin nor the names of its contributors may be 
* used to endorse or promote products derived from this software without specific prior written 
* permission.
* 
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR 
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF 
* THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

using System;
using Bio.Views.Structure.Editor.Internal.Selection;
using Bio.Views.Structure.Editor.Views;
using Bio.Views.ViewModels;
using JulMar.Windows;

namespace Bio.Views.Structure.Editor.ViewModels
{
    public class SecondaryStructureEditorVisualComponentInspectorViewModel : SidebarViewModel<SecondaryStructureEditorVisualComponentInspector>
    {
        private SecondaryStructureEditorViewModel _editorVM;
        private PropertyObserver<SecondaryStructureEditorViewModel> _editorVMDataChanged;

        private object _selectedVisual;
        public object SelectedVisual
        {
            get { return _selectedVisual; }
            private set
            {
                _selectedVisual = value;
                OnPropertyChanged("SelectedVisual");
            }
        }

        private StructureElementSelectionMode _currentSelectionMode;
        public StructureElementSelectionMode ElementSelectionMode
        {
            get { return _currentSelectionMode; }
            private set
            {
                _currentSelectionMode = value;
                _selectedVisual = null;
                OnPropertyChanged("ElementSelectionMode", "SelectedVisual");
            }
        }

        public void TriggerRefresh()
        {
            OnPropertyChanged("ElementSelectionMode", "SelectedVisual");
        }

        public SecondaryStructureEditorVisualComponentInspectorViewModel(SecondaryStructureEditorViewModel editorVM)
        {
            if (editorVM == null)
                throw new ArgumentException("Parent SecondaryStructureEditorViewModel is null");

            Title = DEFAULT_TITLE;
            IsDocked = true;
            FloatingWindowInitialWidth = 300; //Has to be a little wider than the property grid to pickup the scrollbar.

            _editorVM = editorVM;
            _editorVMDataChanged = new PropertyObserver<SecondaryStructureEditorViewModel>(_editorVM);
            _editorVMDataChanged.RegisterHandler(vm => vm.ElementSelectionMode, vm => OnEditorSelectionModeChanged());
            _editorVMDataChanged.RegisterHandler(vm => vm.SelectedElement, vm => OnEditorSelectionChanged());

            SynchronizeToSecondaryStructureEditorState();
        }

        public SecondaryStructureEditorVisualComponentInspectorViewModel()
        {
            Title = DEFAULT_TITLE;
            IsDocked = true;
            FloatingWindowInitialWidth = 275;
            ElementSelectionMode = StructureElementSelectionMode.None;
            SelectedVisual = null;
        }

        public void SynchronizeToSecondaryStructureEditorState()
        {
            if (_editorVM != null)
            {
                ElementSelectionMode = _editorVM.ElementSelectionMode;
                SelectedVisual = _editorVM.SelectedElement;
            }
        }

        private void OnEditorSelectionModeChanged()
        {
            ElementSelectionMode = _editorVM.ElementSelectionMode;
        }

        private void OnEditorSelectionChanged()
        {
            SelectedVisual = _editorVM.SelectedElement;
        }

        private static string DEFAULT_TITLE = "Selected Element Property Inspector";
    }
}
